型射影:Scala 3で廃止予定の機能(7)

Scala 3.3.1
最終更新:2020年9月20日

[AD] scalapediaでは記事作成ボランティアを募集しています

この記事では、Scala 3から不可能となった、抽象型を使用した型射影について解説します。

抽象型の型射影が禁止された

これまでScalaでは、Tを任意の型とし、ATの型のメンバとしたときの、一般型射影T#Aを許可していました。

Dottyでは、Tが抽象型の場合には禁止されるようになりました。

ただし、Tがクラスや型エイリアスである場合には問題ありません。

抽象型の型射影を使ったコードを書き換えるには、経路依存型や暗黙のパラメータの使用を検討してください。

変更の理由と影響

この変更は、型射影を無制限とすると、コンパイルは通るにもかかわらず実行時エラーjava.lang.ClassCastExceptionを投げる例が生じてしまうことから行われました。

詳しくはこちらのIssueをご覧ください。

この制限により、SKIコンビナート演算の型レベルのエンコーディングができなくなります。

SKIコンビネータ演算、あるいはその型レベルのエンコーディングについては以下のリンクで詳しく解説されています。

移行はScala 3.0にアップデートしてからがおすすめ

型射影はScala 3.0でも使用することができます。

3.0において型射影を書くと、場合によってはコンパイルエラーになります。
しかし移行オプション3.0-migrationを設定すると、以前と同様に使用することができます。

移行オプションについてはこちらの記事をご覧ください。

移行コストが高いと予想されるので、3.0へのアップデート後、パワーアップしたScalaの機能をフル活用して書き換えるのが得策です。

サイト内検索